/* Cliente para o Servidor de Dominó */

#include "testa.h"

int main(int argc, char *argv[])
{

	int Meusocket;
	struct hostent *he;
	struct sockaddr_in seu_endereco;

	if (argc != 2) {
		fprintf(stderr,"Qual o ip?\n");
		exit(1);
	}

	if ((he=gethostbyname(argv[1])) == NULL)   /* envia host info */
	{
		herror("gethostbyname");
		exit(1);
	}
	if ((Meusocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
	{
		perror("socket");
		exit(1);
	}

	seu_endereco.sin_family = AF_INET;
	seu_endereco.sin_port = htons(PORTA);
	seu_endereco.sin_addr = *((struct in_addr *)he->h_addr);
	bzero(&(seu_endereco.sin_zero), 8);

	if (connect(Meusocket,(struct sockaddr *)&seu_endereco, sizeof(struct sockaddr)) ==-1) 
	{
		perror("connect");
		exit(1);
	}

	/* DOMINO */

	char recebe[1000];
	
	// S: OK
	memset(recebe,0,sizeof(recebe));
	//char recebe0[1000];
	read(Meusocket, recebe, sizeof(recebe));
	printf ("SERVIDOR = %s", recebe);

	// C: ID u p
	char VAI[1000]="ID teste teste\r\n\0";
	write(Meusocket, VAI, sizeof(VAI));	
	printf ("CLIENTE = %s", VAI);

	// S: OK ou ERRO
	memset(recebe,0,sizeof(recebe));
	//char recebe1[1000];
	read(Meusocket, recebe, sizeof(recebe));
	printf ("SERVIDOR = %s", recebe);
	
	// S: AGUARDE n
	memset(recebe,0,sizeof(recebe));
	//char recebe2[1000];
	read(Meusocket, recebe, sizeof(recebe));
	printf ("SERVIDOR = %s", recebe);

	// C: OK
	char OK[1000]="OK\r\n";
	write(Meusocket, OK, sizeof(OK));
	printf ("CLIENTE = %s", OK);


	//LOGICA DO JOGO DE DOMINO
        int i, j, k, npedras, t=0;
        char nomes[4][50] = {"ESTADO","JOGUE","OK","JOGADOR"};
        char var[50], pedra[100], mimpedras[100], nmesa[100], pini, pfim, aux;

	struct recebe {
		char minha[100];
		char ponta[100];
        	char mesa[100];
        };
        
        struct recebe adv[100];
	
	/* METODOS */
	int monta_mesa(){

		char mesaux[100]="";
		int i;
		char lado1=pedra[0];
		char lado2=pedra[1];
		char p_ult=adv[t].mesa[strlen(adv[t].mesa)-1];

		if (strcmp(pedra,"66")==0){
			strcat(adv[t].mesa,pedra);
			printf(">>>MESA1: %s\n", adv[t].mesa);
		}else if (lado1==p_ult){
			strcat(adv[t].mesa,pedra);
			printf(">>>MESA2: %s\n", adv[t].mesa);	
		}else if (lado1==adv[t].mesa[0]){
			sprintf(pedra,"%c%c",lado2, lado1);
			sprintf(mesaux,"%s",pedra);
			strcat(mesaux,adv[t].mesa);
			adv[t].mesa[0]='\0';
			strcat(adv[t].mesa, mesaux);
			printf(">>>MESA3: %s\n", adv[t].mesa);	
		}else if (lado2==p_ult){
			sprintf (pedra,"%c%c",lado2, lado1);
			strcat(adv[t].mesa,pedra);
			printf(">>>MESA4: %s\n", adv[t].mesa);	
		}else if (lado2==adv[t].mesa[0]){
			sprintf (mesaux,"%s",pedra);
			strcat(mesaux,adv[t].mesa);
			adv[t].mesa[0]='\0';
			strcat(adv[t].mesa, mesaux);
			printf(">>>MESA5: %s\n", adv[t].mesa);	
		}

		return(0);
	}

	int jogada_valida(){
		char JOGADA[100];
		int ponta1=adv[t].mesa[0], ponta2=adv[t].mesa[strlen(adv[t].mesa)-1], num;

		if (!strcmp(adv[t].mesa,"")){
			strcpy(JOGADA,"JOGADA 66\r\n\0");
			write(Meusocket, JOGADA, sizeof(JOGADA));
			printf ("CLIENTE = %s", JOGADA);
		}else{
			//printf(">>>>>>>>>>>>>>>>>>%c e %c\n",adv[t].mesa[0],adv[t].mesa[strlen(adv[t].mesa)-1]);

			if (strchr(mimpedras, ponta1)){
				num=strchr(mimpedras, ponta1)-mimpedras;
				if((num%2)==0){
					sprintf (JOGADA,"JOGADA %c%c\r\n\0", mimpedras[num],mimpedras[num+1]);
					memmove(&mimpedras[num],&mimpedras[num+2],strlen(mimpedras)-num);
					write(Meusocket, JOGADA, sizeof(JOGADA));
					printf ("CLIENTE = %s", JOGADA);
					//printf ("MINPEDA1 = %s", mimpedras);
				}else{
					sprintf (JOGADA,"JOGADA %c%c\r\n\0", mimpedras[num-1],mimpedras[num]);
					memmove(&mimpedras[num-1],&mimpedras[num+1],strlen(mimpedras)-num);
					write(Meusocket, JOGADA, sizeof(JOGADA));
					printf ("CLIENTE = %s", JOGADA);
					//printf ("MINPEDA2 = %s", mimpedras);
				}
			}else if(strchr(mimpedras, ponta2)){
				num=strchr(mimpedras, ponta2)-mimpedras;
				if((num%2)==0){
					sprintf (JOGADA,"JOGADA %c%c\r\n\0", mimpedras[num],mimpedras[num+1]);
					memmove(&mimpedras[num],&mimpedras[num+2],strlen(mimpedras)-num);
					write(Meusocket, JOGADA, sizeof(JOGADA));
					printf ("CLIENTE = %s", JOGADA);
					//printf ("MINPEDA3 = %s", mimpedras);
				}else{
					sprintf (JOGADA,"JOGADA %c%c\r\n\0", mimpedras[num-1],mimpedras[num]);
					memmove(&mimpedras[num-1],&mimpedras[num+1],strlen(mimpedras)-num);
					write(Meusocket, JOGADA, sizeof(JOGADA));
					printf ("CLIENTE = %s", JOGADA);
					//printf ("MINPEDA4 = %s", mimpedras);
				}

			}

		}
		printf (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.MINPEDA = %s\n", mimpedras);
		sscanf(JOGADA, "%*s %s\0", pedra);
		monta_mesa();
		return(0);
	}

	/* INICIO DO SWITCH */

	do
	{
		i = 0;
		while ( (strcmp(var,nomes[i]) != 0) && (i < 100))
		{
		    i++;
		}

	    	switch (i)
	    	{
			case 0:	//S:ESTADO e C:OK
				printf ("SERVIDOR = %s\n", recebe);
				sscanf(recebe, "%*s %*d %*d %*d %*d %*d %s\0", mimpedras);
				write(Meusocket, OK, sizeof(OK));
				printf ("CLIENTE = %s", OK);
			break;
			case 1:	//S:JOGUE, C:OK e C:JOGADA
				printf ("SERVIDOR = %s", recebe);

				write(Meusocket, OK, sizeof(OK));
				printf ("CLIENTE = %s", OK);

				jogada_valida();

				
			break;
			case 2: //S:OK
				printf ("SERVIDOR = %s", recebe);
			break;
			case 3: //S:JOGADOR e C:OK
				printf ("SERVIDOR = %s", recebe);
				sscanf(recebe, "%*s %*s %s\0", pedra);

				write(Meusocket, OK, sizeof(OK));
				printf ("CLIENTE = %s", OK);
				
				monta_mesa();
			break;
		}
		memset(recebe,0,sizeof(recebe));
		read(Meusocket, recebe, sizeof(recebe));
		sscanf(recebe, "%s", var);
	}while(strcmp(var,"FIM"));

	

	close(Meusocket);

	return 0;
}
